﻿using SQ.Calculadora.Interfaces;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SQ.Calculadora.Implementations
{
    public class CalculadoraMediaAritmetica : ICalculadora
    {
        public List<int> ListaDiferencas
        {
            get;
            set;
        }

        public CalculadoraMediaAritmetica(List<int> listaDiferencas)
        {
            this.ListaDiferencas = listaDiferencas;
        }

        public int CalcularTempoEspera()
        {
            var mediaAritmetica = CalcularMediaAritmetica();

            var desvioPadrao = CalcularDesvioPadrao(mediaAritmetica);

            var coeficienteDeVariacao = CalcularCoeficienteVariacao(mediaAritmetica, desvioPadrao);

            return mediaAritmetica;
        }

        private int CalcularMediaAritmetica()
        {
            var totalDiferenca = 0;
            var media = 0;

            this.ListaDiferencas.ForEach(p => totalDiferenca = totalDiferenca + p);

            media = totalDiferenca / this.ListaDiferencas.Count;

            return media;
        }

        private int CalcularDesvioPadrao(int mediaAritmetica)
        {
            var desvio = 0;
            var somatoria = 0;

            foreach (var diferenca in ListaDiferencas)
            {
                somatoria = somatoria + Convert.ToInt32(Math.Pow(diferenca - mediaAritmetica, 2));
            }

            desvio = Convert.ToInt32(Math.Sqrt(somatoria / this.ListaDiferencas.Count));

            return desvio;
        }

        private int CalcularCoeficienteVariacao(int mediaAritmetica, int desvioPadrao)
        {
            var desvio = (desvioPadrao / mediaAritmetica) * 100;

            return desvio;
        }
    }
}
